home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / gfx / 3d / irit50src.lha / irit5 / grapdrvs / gen_grap.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-20  |  37.7 KB  |  1,029 lines

  1. /*****************************************************************************
  2. *   General routines common to graphics driver.                     *
  3. *                                         *
  4. * Written by:  Gershon Elber                Ver 0.1, June 1993.  *
  5. *****************************************************************************/
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <math.h>
  10. #include "irit_sm.h"
  11. #include "genmat.h"
  12. #include "getarg.h"
  13. #include "config.h"
  14. #include "iritprsr.h"
  15. #include "allocate.h"
  16. #include "attribut.h"
  17. #include "iritgrap.h"
  18. #include "irit_soc.h"
  19.  
  20. #ifdef OS2GCC
  21. #define INCL_DOSPROCESS
  22. #include <os2.h>
  23. #endif /* OS2GCC */
  24.  
  25. #define MAX_ROTATE_ANGLE    45.0 /* Max. rates used by interactive mode. */
  26. #define MAX_TRANSLATE_FACTOR    2.0
  27. #define MAX_SCALE_FACTOR    2.0
  28. #define MAX_CLIP_FACTOR        0.5
  29.  
  30. typedef struct StateNameNumType {
  31.    IGGlblStateType Num;
  32.    char *Name;
  33. } StateNameNumType;
  34.  
  35. static StateNameNumType StateNameNum[] =
  36. {
  37.     { IG_STATE_MORE_SENSITIVE,        "MoreSense" },
  38.     { IG_STATE_LESS_SENSITIVE,        "LessSense" },
  39.     { IG_STATE_SCR_OBJ_TGL,        "ScrnObjct" },
  40.     { IG_STATE_PERS_ORTHO_TGL,        "PerpsOrtho" },
  41.     { IG_STATE_DEPTH_CUE,        "DepthCue" },
  42.     { IG_STATE_CACHE_GEOM,        "CacheGeom" },
  43.     { IG_STATE_DRAW_SOLID,        "DrawSolid" },
  44.     { IG_STATE_BACK_FACE_CULL,        "BFaceCull" },
  45.     { IG_STATE_DOUBLE_BUFFER,        "DblBuffer" },
  46.     { IG_STATE_ANTI_ALIASING,        "AntiAlias" },
  47.     { IG_STATE_DRAW_INTERNAL,        "DrawIntrnl" },
  48.     { IG_STATE_DRAW_VNORMAL,        "DrawVNrml" },
  49.     { IG_STATE_DRAW_PNORMAL,        "DrawPNrml" },
  50.     { IG_STATE_DRAW_SRF_MESH,        "DSrfMesh" },
  51.     { IG_STATE_DRAW_SRF_POLY,        "DSrfPoly" },
  52.     { IG_STATE_FOUR_PER_FLAT,        "4PerFlat" },
  53.     { IG_STATE_MORE_ISOLINES,        "MoreIso" },
  54.     { IG_STATE_LESS_ISOLINES,        "LessIso" },
  55.     { IG_STATE_FINER_APPROX,        "FinrAprx" },
  56.     { IG_STATE_COARSER_APPROX,        "CrsrAprx" },
  57.     { IG_STATE_LONGER_VECTORS,        "LngrVecs" },
  58.     { IG_STATE_SHORTER_VECTORS,        "ShrtrVecs" },
  59.     { IG_STATE_WIDER_LINES,        "WiderLns" },
  60.     { IG_STATE_NARROW_LINES,        "NarrwLns" },
  61.     { IG_STATE_FINER_ADAP_ISO,        "FinrAdapIso" },
  62.     { IG_STATE_COARSER_ADAP_ISO,    "CRsrAdapIso" },
  63.     { IG_STATE_FINER_RULED_SRF,        "FinerRld" },
  64.     { IG_STATE_COARSER_RULED_SRF,    "CrsrRld" },
  65.     { IG_STATE_RULED_SRF_APPROX,    "RuledSrfApx" },
  66.     { IG_STATE_ADAP_ISO_DIR,        "AdapIsoDir" },
  67.     { IG_STATE_VIEW_FRONT,        "Front" },
  68.     { IG_STATE_VIEW_SIDE,        "Side" },
  69.     { IG_STATE_VIEW_TOP,        "Top" },
  70.     { IG_STATE_VIEW_ISOMETRY,        "Isometry" },
  71.     { IG_STATE_CLEAR_VIEW,        "Clear" },
  72.     { 0,                NULL }
  73. };
  74.  
  75. static int
  76.     GlblDelayedClear = FALSE,
  77.     GlblProcessCommandMesssages = TRUE,
  78.     GlblNormalLenAux = 200;
  79.  
  80. static MatrixType PushViewMat, PushPrspMat;
  81. MatrixType IGGlblIsometryViewMat = {         /* Isometric view, by default. */
  82.     { -0.707107, -0.408248, 0.577350, 0.000000 },
  83.     {  0.707107, -0.408248, 0.577350, 0.000000 },
  84.     {  0.000000,  0.816496, 0.577350, 0.000000 },
  85.     {  0.000000,  0.000000, 0.000000, 1.000000 }
  86. };
  87.  
  88. static char
  89.     *GlblExecAnimEachStep = NULL,
  90.     *GlblLightSrcPosStr = "1.0, 2.0, 10.0, 0.0";
  91.  
  92. #ifdef __UNIX__
  93. static char
  94.     *GlblBackGroundStr = "20 20 20";
  95.  
  96. int IGGlblBackGroundColor[3] = { 20, 20, 20 },
  97. #else
  98. static char
  99.     *GlblBackGroundStr = "63 63 63";
  100.  
  101. int IGGlblBackGroundColor[3] = { 63, 63, 63 },
  102. #endif /* __UNIX__ */
  103.     IGGlblDrawInternal = FALSE,
  104.     IGGlblDrawVNormal = FALSE,
  105.     IGGlblDrawPNormal = FALSE,
  106.     IGGlblMore = FALSE,
  107.     IGGlblPolygonOptiApprox = 0,
  108.     IGGlblPolylineOptiApprox = 0,
  109.     IGGlblForceUnitMat = FALSE,
  110.     IGGlblDrawSolid = FALSE,
  111.     IGGlblBackFaceCull = FALSE,
  112.     IGGlblDoDoubleBuffer = TRUE,
  113.     IGGlblNumOfIsolines = 10,
  114.     IGGlblSamplesPerCurve = IG_DEFAULT_SAMPLES_PER_CURVE,
  115.     IGGlblLineWidth = 1,
  116.     IGGlblAdapIsoDir = CAGD_CONST_U_DIR,
  117.     IGGlblDepthCue = TRUE,
  118.     IGGlblCacheGeom = TRUE,
  119.     IGGlblFourPerFlat = TRUE,
  120.     IGGlblAntiAliasing = TRUE,
  121.     IGGlblDrawSurfaceMesh = FALSE,
  122.     IGGlblDrawSurfacePoly = FALSE,
  123.     IGGlblStandAlone = TRUE,
  124.     IGGlblTransformMode = IG_TRANS_SCREEN,
  125.     IGGlblViewMode = IG_VIEW_PERSPECTIVE,
  126.     IGGlblDebugObjectsFlag = FALSE,
  127.     IGGlblDebugEchoInputFlag = FALSE,
  128.     IGGlblIntensityHighState = TRUE,
  129.     IGGlblDisplayListIsUsed = FALSE,
  130.     IGGlblAbortKeyPressed = FALSE,
  131.     IGGlblAnimation = FALSE,
  132.     IGGlblNumFiles,
  133.     IGGlblPrgmInput,
  134.     IGGlblPrgmOutput;
  135.  
  136. char
  137.     *IGGlblTransPrefPos = "455, 640, 520, 965",
  138.     *IGGlblViewPrefPos =  "  1, 450, 520, 965",
  139.     **IGGlblFileNames;
  140.  
  141. RealType
  142.     IGGlblLightSrcPos[4] = { 1.0, 2.0, 10.0, 0.0 },
  143.     IGGlblFineNess = 10.0,
  144.     IGGlblChangeFactor = 1.0,
  145.     IGGlblZMinClip = -2.0,
  146.     IGGlblZMaxClip = 2.0,
  147.     IGGlblNormalLen = 0.2;
  148.  
  149. MatrixType IGGlblCrntViewMat;
  150.  
  151. IPObjectStruct
  152.     *IGGlblDisplayList = NULL;
  153.  
  154. AnimationStruct IGAnimation;
  155.  
  156. static ConfigStruct SetUp[] =
  157. {
  158.   { "TransPrefPos",   "-g", (VoidPtr) &IGGlblTransPrefPos,    SU_STRING_TYPE },
  159.   { "ViewPrefPos",    "-G", (VoidPtr) &IGGlblViewPrefPos,    SU_STRING_TYPE },
  160.   { "BackGround",     "-b", (VoidPtr) &GlblBackGroundStr,    SU_STRING_TYPE },
  161.   { "LightSrcPos",    "-S", (VoidPtr) &GlblLightSrcPosStr,    SU_STRING_TYPE },
  162.   { "ExecAnim",       "-x", (VoidPtr) &GlblExecAnimEachStep,    SU_STRING_TYPE },
  163.   { "Internal",          "-i", (VoidPtr) &IGGlblDrawInternal,    SU_BOOLEAN_TYPE },
  164.   { "DrawVNormal",    "-n", (VoidPtr) &IGGlblDrawVNormal,    SU_BOOLEAN_TYPE },
  165.   { "DrawPNormal",    "-N", (VoidPtr) &IGGlblDrawPNormal,    SU_BOOLEAN_TYPE },
  166.   { "MoreVerbose",    "-m", (VoidPtr) &IGGlblMore,        SU_BOOLEAN_TYPE },
  167.   { "UnitMatrix",     "-u", (VoidPtr) &IGGlblForceUnitMat,    SU_BOOLEAN_TYPE },
  168.   { "DrawSolid",      "-r", (VoidPtr) &IGGlblDrawSolid,        SU_BOOLEAN_TYPE },
  169.   { "BFaceCull",      "-B", (VoidPtr) &IGGlblBackFaceCull,    SU_BOOLEAN_TYPE },
  170.   { "DoubleBuffer",   "-2", (VoidPtr) &IGGlblDoDoubleBuffer,    SU_BOOLEAN_TYPE },
  171.   { "DebugObjects",   "-d", (VoidPtr) &IGGlblDebugObjectsFlag,    SU_BOOLEAN_TYPE },
  172.   { "DebugEchoInput", "-D", (VoidPtr) &IGGlblDebugEchoInputFlag,SU_BOOLEAN_TYPE },
  173.   { "DepthCue",          "-c", (VoidPtr) &IGGlblDepthCue,        SU_BOOLEAN_TYPE },
  174.   { "CacheGeom",      "-C", (VoidPtr) &IGGlblCacheGeom,        SU_BOOLEAN_TYPE },
  175.   { "FourPerFlat",    "-4", (VoidPtr) &IGGlblFourPerFlat,    SU_BOOLEAN_TYPE },
  176.   { "AntiAlias",      "-a", (VoidPtr) &IGGlblAntiAliasing,    SU_BOOLEAN_TYPE },
  177.   { "DrawSurfaceMesh","-M", (VoidPtr) &IGGlblDrawSurfaceMesh,    SU_BOOLEAN_TYPE },
  178.   { "DrawSurfacePoly","-P", (VoidPtr) &IGGlblDrawSurfacePoly,    SU_BOOLEAN_TYPE },
  179.   { "StandAlone",     "-s", (VoidPtr) &IGGlblStandAlone,    SU_BOOLEAN_TYPE },
  180.   { "NumOfIsolines",  "-I", (VoidPtr) &IGGlblNumOfIsolines,    SU_INTEGER_TYPE },
  181.   { "SamplesPerCurve","-f", (VoidPtr) &IGGlblSamplesPerCurve,    SU_INTEGER_TYPE },
  182.   { "LineWidth",      "-l", (VoidPtr) &IGGlblLineWidth,        SU_INTEGER_TYPE },
  183.   { "AdapIsoDir",     "",   (VoidPtr) &IGGlblAdapIsoDir,    SU_INTEGER_TYPE },
  184.   { "PolygonOpti",    "-F", (VoidPtr) &IGGlblPolygonOptiApprox,    SU_INTEGER_TYPE },
  185.   { "PolylineOpti",   "-f", (VoidPtr) &IGGlblPolylineOptiApprox,SU_INTEGER_TYPE },
  186.   { "TransMode",      "",   (VoidPtr) &IGGlblTransformMode,    SU_INTEGER_TYPE },
  187.   { "ViewMode",          "",   (VoidPtr) &IGGlblViewMode,        SU_INTEGER_TYPE },
  188.   { "NormalLength",   "-L", (VoidPtr) &GlblNormalLenAux,    SU_INTEGER_TYPE },
  189.   { "ZClipMin",          "-Z", (VoidPtr) &IGGlblZMinClip,        SU_REAL_TYPE },
  190.   { "ZClipMax",          "-Z", (VoidPtr) &IGGlblZMaxClip,        SU_REAL_TYPE },
  191.   { "FineNess",          "-F", (VoidPtr) &IGGlblFineNess,        SU_REAL_TYPE }
  192. };
  193. #define NUM_SET_UP    (sizeof(SetUp) / sizeof(ConfigStruct))
  194.  
  195. #ifdef NO_CONCAT_STR
  196. static char
  197.     *GenVersionStr = "     Version 5.0,    Gershon Elber,\n\
  198.     (C) Copyright 1989/90-95 Gershon Elber, Non commercial use only.";
  199. #else
  200. static char
  201.     *GenVersionStr = "    " VERSION ",    Gershon Elber,    "
  202.     __DATE__ ",   " __TIME__ "\n"
  203.     "(C) Copyright 1989/90-95 Gershon Elber, Non commercial use only.";
  204. #endif /* NO_CONCAT_STR */
  205.  
  206. static char
  207. #ifdef DOUBLE
  208.     *GenCtrlStr = " s%- u%- n%- N%- i%- c%- C%- m%- a%- g%-x1,x2,y1,y2!s G%-x1,x2,y1,y2!s I%-#IsoLines!d F%-PolygonOpti|FineNess!d!F f%-PolylineOpti|SampPerCrv!d!d l%-LineWidth!d r%- B%- 2%- d%- D%- L%-NormalLen!d 4%- b%-BackGround!d!d!d S%-LgtSrcPos!F!F!F!F Z%-ZMin|ZMax!F!F M%- P%- x%-ExecAnim!s z%- DFiles!*s";
  209. #else
  210.     *GenCtrlStr = " s%- u%- n%- N%- i%- c%- C%- m%- a%- g%-x1,x2,y1,y2!s G%-x1,x2,y1,y2!s I%-#IsoLines!d F%-PolygonOpti|FineNess!d!f f%-PolylineOpti|SampPerCrv!d!d l%-LineWidth!d r%- B%- 2%- d%- D%- L%-NormalLen!d 4%- b%-BackGround!d!d!d S%-LgtSrcPos!f!f!f!f Z%-ZMin|ZMax!f!f M%- P%- x%-ExecAnim!s z%- DFiles!*s";
  211. #endif /* DOUBLE */
  212.  
  213. static void HandleAnimate(char *Params);
  214. static void AddReplaceObjDisplayList(IPObjectStruct **DisplayList,
  215.                      IPObjectStruct *NewObj,
  216.                      char *ObjName);
  217. static int ReplyWithObject(IPObjectStruct *DisplayList, char *ObjName);
  218.  
  219. /*****************************************************************************
  220. * DESCRIPTION:                                                               M
  221. * Sets up configuration of global variables.                     M
  222. *                                                                            *
  223. * PARAMETERS:                                                                M
  224. *   PrgmName:    Name of program invoking this module.                       M
  225. *   argc, argv:  Comand line.                             M
  226. *                                                                            *
  227. * RETURN VALUE:                                                              M
  228. *   void                                                                     M
  229. *                                                                            *
  230. * KEYWORDS:                                                                  M
  231. *   IGConfigureGlobals                                                       M
  232. *****************************************************************************/
  233. void IGConfigureGlobals(char *PrgmName, int argc, char **argv)
  234. {
  235.     int Error,
  236.     TransPosFlag = FALSE,
  237.     ViewPosFlag = FALSE,
  238.     IsoLinesFlag = FALSE,
  239.     SrfFinenessFlag = FALSE,
  240.     CrvFinenessFlag = FALSE,
  241.     LineWidthFlag = FALSE,
  242.     NormalLenFlag = FALSE,
  243.     BackGroundFlag = FALSE,
  244.     LightSrcPosFlag = FALSE,
  245.     ZClipPlaneFlag = FALSE,
  246.     ExecAnimEachStepFlag = FALSE,
  247.     VerFlag = FALSE;
  248.     char Line[LINE_LEN_VLONG];
  249.  
  250.     Config(PrgmName, SetUp, NUM_SET_UP);   /* Read config. file if exists. */
  251.  
  252.     sscanf(GlblBackGroundStr, "%d %d %d",
  253.        &IGGlblBackGroundColor[0],
  254.        &IGGlblBackGroundColor[1],
  255.        &IGGlblBackGroundColor[2]);
  256.     sscanf(GlblLightSrcPosStr,
  257. #ifdef DOUBLE
  258.        "%lf,%lf,%lf,%lf",
  259. #else
  260.        "%f,%f,%f,%f",
  261. #endif /* DOUBLE */
  262.        &IGGlblLightSrcPos[0],
  263.        &IGGlblLightSrcPos[1],
  264.        &IGGlblLightSrcPos[2],
  265.        &IGGlblLightSrcPos[3]);
  266.  
  267.     strcpy(Line, PrgmName);
  268.     strcat(Line, GenCtrlStr);
  269.  
  270.     if ((Error = GAGetArgs(argc, argv, Line, &IGGlblStandAlone,
  271.                &IGGlblForceUnitMat, &IGGlblDrawVNormal,
  272.                &IGGlblDrawPNormal, &IGGlblDrawInternal,
  273.                &IGGlblDepthCue, &IGGlblCacheGeom,
  274.                &IGGlblMore, &IGGlblAntiAliasing,
  275.                &TransPosFlag, &IGGlblTransPrefPos,
  276.                &ViewPosFlag, &IGGlblViewPrefPos,
  277.                &IsoLinesFlag, &IGGlblNumOfIsolines,
  278.                &SrfFinenessFlag, &IGGlblPolygonOptiApprox,
  279.                &IGGlblFineNess, &CrvFinenessFlag,
  280.                &IGGlblPolylineOptiApprox,
  281.                &IGGlblSamplesPerCurve, &LineWidthFlag,
  282.                &IGGlblLineWidth, &IGGlblDrawSolid,
  283.                &IGGlblBackFaceCull, &IGGlblDoDoubleBuffer,
  284.                &IGGlblDebugObjectsFlag,
  285.                &IGGlblDebugEchoInputFlag, &NormalLenFlag,
  286.                &GlblNormalLenAux, &IGGlblFourPerFlat,
  287.                &BackGroundFlag, &IGGlblBackGroundColor[0],
  288.                &IGGlblBackGroundColor[1],
  289.                &IGGlblBackGroundColor[2],
  290.                &LightSrcPosFlag, &IGGlblLightSrcPos[0],
  291.                &IGGlblLightSrcPos[1],
  292.                &IGGlblLightSrcPos[2],
  293.                &IGGlblLightSrcPos[3], &ZClipPlaneFlag,
  294.                &IGGlblZMinClip, &IGGlblZMaxClip,
  295.                &IGGlblDrawSurfaceMesh,
  296.                &IGGlblDrawSurfacePoly,
  297.                &ExecAnimEachStepFlag, &GlblExecAnimEachStep,
  298.                &VerFlag,
  299.                &IGGlblNumFiles, &IGGlblFileNames )) != 0) {
  300.     GAPrintErrMsg(Error); GAPrintHowTo(Line);
  301.     exit(1);
  302.     }
  303.  
  304.     if (VerFlag) {
  305.     fprintf(stderr, "\n%s%s\n\n", PrgmName, GenVersionStr);
  306.     GAPrintHowTo(Line);
  307.     ConfigPrint(SetUp, NUM_SET_UP);
  308.     exit(0);
  309.     }
  310.  
  311.     if (!IGGlblStandAlone)
  312.     IritPrsrClntAcceptConnect(&IGGlblPrgmInput, &IGGlblPrgmOutput);
  313.     if (IGGlblDebugEchoInputFlag)
  314.     SocEchoInput(IGGlblPrgmInput, TRUE);
  315.  
  316.     IGGlblNormalLen = GlblNormalLenAux / 1000.0;
  317.  
  318.     if (IGGlblAdapIsoDir == 1)
  319.     IGGlblAdapIsoDir = CAGD_CONST_U_DIR;
  320.     else if (IGGlblAdapIsoDir == 2)
  321.     IGGlblAdapIsoDir = CAGD_CONST_V_DIR;
  322.  
  323.     /* Get the data files: */
  324.     if (IGGlblNumFiles > 0 &&
  325.     (IGGlblDisplayList = IritPrsrGetDataFiles(IGGlblFileNames,
  326.                           IGGlblNumFiles, TRUE, TRUE))
  327.                                      != NULL) {
  328.     /* We expects a linear linked list - no hierarchy. */
  329.     IGGlblDisplayList = IritPrsrFlattenTree(IGGlblDisplayList);
  330.  
  331.     IGGlblViewMode = IritPrsrWasPrspMat ? IG_VIEW_PERSPECTIVE
  332.                         : IG_VIEW_ORTHOGRAPHIC;
  333.     }
  334.  
  335.     if (IGGlblForceUnitMat) {
  336.     MatGenUnitMat(IritPrsrViewMat);
  337.     IGGlblViewMode = IG_VIEW_ORTHOGRAPHIC;
  338.     }
  339.  
  340.     /* Make sure that if we ask to draw solid, depth cueing is disabled. */
  341.     if (IGGlblDrawSolid)
  342.     IGGlblDepthCue = FALSE;
  343.  
  344.     GEN_COPY(PushViewMat, IritPrsrViewMat, sizeof(MatrixType));
  345.     GEN_COPY(PushPrspMat, IritPrsrPrspMat, sizeof(MatrixType));
  346.  
  347.     AnimResetAnimStruct(&IGAnimation);
  348.     if (GlblExecAnimEachStep != NULL && strlen(GlblExecAnimEachStep) > 0)
  349.     IGAnimation.ExecEachStep = GlblExecAnimEachStep;
  350.     AnimFindAnimationTime(&IGAnimation, IGGlblDisplayList);
  351. }
  352.  
  353. /*****************************************************************************
  354. * DESCRIPTION:                                                               M
  355. * Are we suppose to handle command messages of the socket? A command message M
  356. * will be a string objct sent over the socket with object name "COMMAND_".   M
  357. *                                                                            *
  358. * PARAMETERS:                                                                M
  359. *   ProcessCommandMessages:   Sets the command message handling option.      M
  360. *                                                                            *
  361. * RETURN VALUE:                                                              M
  362. *   void                                                                     M
  363. *                                                                            *
  364. * KEYWORDS:                                                                  M
  365. *   IGProcessCommandMessages                                                 M
  366. *****************************************************************************/
  367. void IGProcessCommandMessages(int ProcessCommandMessages)
  368. {
  369.     GlblProcessCommandMesssages = ProcessCommandMessages;
  370. }
  371.  
  372. /*****************************************************************************
  373. * DESCRIPTION:                                                               M
  374. * Reads an object from communication socket.                     M
  375. *   Returns TRUE if screen needs to be redrawn in the case that the         M
  376. * DisplayList was modified.                             M
  377. *   This function DOES NOT BLOCK if no input is unavailable.             M
  378. *   Handles commands via a string object with name "COMMAND_", if required   M
  379. *                                                                            *
  380. * PARAMETERS:                                                                M
  381. *   ViewMode:      Either perspective or orthographics.                      M
  382. *   DisplayList:   Global object display list. Will be updated in place.     M
  383. *                                                                            *
  384. * RETURN VALUE:                                                              M
  385. *   int:           TRUE, if display needs to be refreshed.                   M
  386. *                                                                            *
  387. * KEYWORDS:                                                                  M
  388. *   IGReadObjectsFromSocket                                                  M
  389. *****************************************************************************/
  390. int IGReadObjectsFromSocket(int ViewMode, IPObjectStruct **DisplayList)
  391. {
  392.     int Redraw = FALSE;
  393.  
  394.     IPObjectStruct *PObjs;
  395.  
  396.     if ((PObjs = SocReadOneObject(IGGlblPrgmInput)) != NULL) {
  397.     IPObjectStruct *PObj;
  398.  
  399.     /* We expects a linear linked list - no hierarchy. */
  400.     PObjs = IritPrsrFlattenTree(PObjs);
  401.  
  402. #       ifdef __WINNT__
  403.         /* Slim chance that a race will oocur if the following test and */
  404.         /* set is done simultanuously. Should use semaphors probably.   */
  405.         while (IGGlblDisplayListIsUsed)
  406.             IritSleep(10);
  407.         IGGlblDisplayListIsUsed = TRUE;
  408. #    endif /* __WINNT__ */
  409. #    ifdef OS2GCC
  410.     while (IGGlblDisplayListIsUsed) {
  411.         IritSleep(10);
  412.         DosEnterCritSec();
  413.         if (!IGGlblDisplayListIsUsed) {
  414.         IGGlblDisplayListIsUsed = TRUE;
  415.         DosExitCritSec();
  416.         break;
  417.         }
  418.         DosExitCritSec();
  419.     }
  420. #    endif /* OS2GCC */
  421.  
  422.     Redraw = TRUE;
  423.  
  424.     if (GlblDelayedClear) {
  425. #        ifdef OS2GCC
  426.             /* For some reason without this delay, this  */
  427.             /* driver crashes on command toggles.         */
  428.         IritSleep(100);
  429. #        endif /* OS2GCC */
  430.         GlblDelayedClear = FALSE;
  431.         IPFreeObjectList(*DisplayList);
  432.         *DisplayList = NULL;
  433.     }
  434.  
  435.     while (PObjs != NULL) {
  436.         PObj = PObjs;
  437.         PObjs = PObjs -> Pnext;
  438.         PObj -> Pnext = NULL;
  439.  
  440.         if (IGGlblDebugObjectsFlag)
  441.         IritPrsrPutObjectToFile(stderr, PObj);
  442.  
  443.         if (GlblProcessCommandMesssages) {
  444.         switch (PObj -> ObjType) {
  445.             case IP_OBJ_STRING:
  446.                 if (stricmp(PObj -> Name, "COMMAND_") == 0) {
  447.                 char
  448.                 *Str = PObj -> U.Str;
  449.  
  450. #                ifdef OS2GCC
  451.                     /* For some reason without this delay, this  */
  452.                     /* driver crashes on command toggles.         */
  453.                 IritSleep(300);
  454. #                endif /* OS2GCC */
  455.                 if (stricmp(Str, "BEEP") == 0) {
  456.                 IGIritBeep();
  457.                 Redraw = FALSE;
  458.                 }
  459.                 else if (stricmp(Str, "CLEAR") == 0) {
  460.                 IPFreeObjectList(*DisplayList);
  461.                 *DisplayList = NULL;
  462.                 }
  463.                 else if (stricmp(Str, "DCLEAR") == 0) {
  464.                 GlblDelayedClear = TRUE;
  465.                 Redraw = FALSE;
  466.                 }
  467.                 else if (stricmp(Str, "DISCONNECT") == 0) {
  468.                 IritPrsrClntCloseConnect(IGGlblPrgmInput,
  469.                              IGGlblPrgmOutput);
  470.                 Redraw = FALSE;
  471.                 }
  472.                 else if (stricmp(Str, "EXIT") == 0) {
  473.                 IritPrsrClntCloseConnect(IGGlblPrgmInput,
  474.                              IGGlblPrgmOutput);
  475.                 exit(0);
  476.                 }
  477.                 else if (strnicmp(Str, "GETOBJ", 6) == 0) {
  478.                 if (!ReplyWithObject(*DisplayList,
  479.                              &PObj -> U.Str[7]))
  480.                     fprintf(stderr,
  481.                         "No such object \"%s\"\n",
  482.                         &PObj -> U.Str[7]);
  483.                 Redraw = FALSE;
  484.                 }
  485.                 else if (strnicmp(Str, "MSAVE", 5) == 0) {
  486.                 IGSaveCurrentMat(ViewMode, &PObj -> U.Str[6]);
  487.                 Redraw = FALSE;
  488.                 }
  489.                 else if (strnicmp(Str, "REMOVE", 6) == 0) {
  490.                 AddReplaceObjDisplayList(DisplayList, NULL,
  491.                              &PObj -> U.Str[7]);
  492.                 Redraw = TRUE;
  493.                 }
  494.                 else if (strnicmp(Str, "ANIMATE", 7) == 0) {
  495.                 HandleAnimate(&Str[7]);
  496.                 Redraw = TRUE;
  497.                 }
  498.                 else if (strnicmp(Str, "STATE", 5) == 0) {
  499.                 int i;
  500.  
  501.                 Str = &Str[6];
  502.  
  503.                 for (i = 0;
  504.                      StateNameNum[i].Name != NULL;
  505.                      i++) {
  506.                     if (stricmp(Str,
  507.                         StateNameNum[i].Name) == 0) {
  508.                     IGHandleState(StateNameNum[i].Num,
  509.                               TRUE);
  510.                     break;
  511.                     }
  512.                 }
  513.                 }
  514.             }
  515.             IPFreeObject(PObj);
  516.             break;
  517.             case IP_OBJ_MATRIX:
  518.             if (strnicmp(PObj -> Name, "VIEW_MAT", 8) == 0) {
  519.                 GEN_COPY(IritPrsrViewMat, *PObj -> U.Mat,
  520.                      sizeof(MatrixType));
  521.             }
  522.             else if (strnicmp(PObj -> Name, "PRSP_MAT", 8) == 0) {
  523.                 GEN_COPY(IritPrsrPrspMat, *PObj -> U.Mat,
  524.                      sizeof(MatrixType));
  525.             }
  526.             IPFreeObject(PObj);
  527.             break;
  528.             default:
  529.             AddReplaceObjDisplayList(DisplayList, PObj, NULL);
  530.             break;
  531.         }
  532.         }
  533.         else {
  534.         AddReplaceObjDisplayList(DisplayList, PObj, NULL);
  535.         }
  536.     }
  537.  
  538.     IGGlblDisplayListIsUsed = FALSE;
  539.  
  540.     return Redraw;
  541.     }
  542.     else
  543.     return Redraw;
  544. }
  545.  
  546. /*****************************************************************************
  547. * DESCRIPTION:                                                               *
  548. *   Honors an animate request from the server.                               *
  549. *                                                                            *
  550. * PARAMETERS:                                                                *
  551. *   Params:    A strings contains Tmin Tmax Dt, in this order.               *
  552. *                                                                            *
  553. * RETURN VALUE:                                                              *
  554. *   void                                                                     *
  555. *****************************************************************************/
  556. static void HandleAnimate(char *Params)
  557. {
  558.     double TMin, TMax, Dt;
  559.  
  560.     if (sscanf(Params, "%lf %lf %lf", &TMin, &TMax, &Dt) == 3) {
  561.     IGAnimation.StartT = TMin;
  562.     IGAnimation.FinalT = TMax;
  563.     IGAnimation.Dt = Dt;
  564.     AnimDoAnimation(&IGAnimation, IGGlblDisplayList);
  565.     }
  566.     else {
  567.     fprintf(stderr,
  568.         "Animate param, expected \"Tmin Tmax Dt\", found \"%s\"\n",
  569.         Params);
  570.     }
  571. }
  572.  
  573. /*****************************************************************************
  574. * DESCRIPTION:                                                               *
  575. * Adds or replaces an object on the display list.                 *
  576. *   If ObjName is not NULL, that object is removed from the display list.    *
  577. *   Otherwise NewObj is added to the display list, possibly replacing an     *
  578. * object on the display list with the same name.                 *
  579. *                                                                            *
  580. * PARAMETERS:                                                                *
  581. *   DisplayList:   Global display list to update.                            *
  582. *   NewObj:        New object to add to the global display list.             *
  583. *   ObjName:       Name of object to remove from display list.               *
  584. *                                                                            *
  585. * RETURN VALUE:                                                              *
  586. *   void                                                                     *
  587. *****************************************************************************/
  588. static void AddReplaceObjDisplayList(IPObjectStruct **DisplayList,
  589.                      IPObjectStruct *NewObj,
  590.                      char *ObjName)
  591. {
  592.     int Remove = ObjName != NULL;
  593.     char
  594.     *Name = ObjName != NULL ? ObjName : NewObj -> Name;
  595.     IPObjectStruct *PObj;
  596.  
  597.     /* If object has no name or display list is empty, add it. */
  598.     if (!Remove &&
  599.     NewObj != NULL &&
  600.     (strlen(NewObj -> Name) == 0 ||
  601.      NewObj -> Name[0] == '_' ||
  602.      stricmp(NewObj -> Name, "none") == 0)) {
  603.     NewObj -> Pnext = *DisplayList;
  604.     *DisplayList = NewObj;
  605.     return;
  606.     }
  607.     if (*DisplayList == NULL) {
  608.     if (NewObj != NULL) {
  609.         *DisplayList = NewObj;
  610.     }
  611.     return;
  612.     }
  613.  
  614.     if (stricmp(Name, (*DisplayList) -> Name) == 0) {
  615.     if (Remove) {
  616.         PObj = *DisplayList;
  617.         *DisplayList = (*DisplayList) -> Pnext;
  618.         IPFreeObject(PObj);
  619.     }
  620.     else {
  621.         NewObj -> Pnext = (*DisplayList) -> Pnext;
  622.         IPFreeObject(*DisplayList);
  623.         *DisplayList = NewObj;
  624.     }
  625.     }
  626.     else {
  627.     for (PObj = *DisplayList; PObj -> Pnext != NULL; PObj = PObj -> Pnext) {
  628.         if (stricmp(Name, PObj -> Pnext -> Name) == 0) {
  629.         IPObjectStruct
  630.             *PObjTmp = PObj -> Pnext;
  631.  
  632.         if (Remove) {
  633.             PObj -> Pnext = PObjTmp -> Pnext;
  634.         }
  635.         else {
  636.             PObj -> Pnext = NewObj;
  637.             NewObj -> Pnext = PObjTmp -> Pnext;
  638.         }
  639.         IPFreeObject(PObjTmp);
  640.         return;
  641.         }
  642.     }
  643.  
  644.     /* Name was not found. */
  645.     if (!Remove) {
  646.         NewObj -> Pnext = *DisplayList;
  647.         *DisplayList = NewObj;
  648.     }
  649.     }
  650. }
  651.  
  652. /*****************************************************************************
  653. * DESCRIPTION:                                                               *
  654. *   Returns innto the output channel the object requested via ObjName.       *
  655. *                                                                            *
  656. * PARAMETERS:                                                                *
  657. *   DisplayList:   List of all current objects.                              *
  658. *   ObjName:       Name of object to search.                                 *
  659. *                                                                            *
  660. * RETURN VALUE:                                                              *
  661. *   int:       TRUE if succesful, FALSE otherwise.                       *
  662. *                                                                            *
  663. * KEYWORDS:                                                                  *
  664. *   ReplayWithObject                                                         *
  665. *****************************************************************************/
  666. static int ReplyWithObject(IPObjectStruct *DisplayList, char *ObjName)
  667. {
  668.     IPObjectStruct *PObj;
  669.  
  670.     for (PObj = DisplayList; PObj != NULL; PObj = PObj -> Pnext) {
  671.     if (stricmp(ObjName, PObj -> Name) == 0) {
  672.         SocWriteOneObject(IGGlblPrgmOutput, PObj);
  673.         return TRUE;
  674.     }
  675.     }
  676.  
  677.     /* Dumps this string object instead, so we will not block the server. */
  678.     PObj = GenSTRObject("no such object");
  679.     SocWriteOneObject(IGGlblPrgmOutput, PObj);
  680.     IPFreeObject(PObj);
  681.  
  682.     return FALSE;
  683. }
  684.  
  685. /*****************************************************************************
  686. * DESCRIPTION:                                                               M
  687. * Saves the current viewing matrices.                         M
  688. *                                                                            *
  689. * PARAMETERS:                                                                M
  690. *   ViewMode:     Either perspective or orthographic.                        M
  691. *   Name:         File name to save current view at.                         M
  692. *                                                                            *
  693. * RETURN VALUE:                                                              M
  694. *   void                                                                     M
  695. *                                                                            *
  696. * KEYWORDS:                                                                  M
  697. *   IGSaveCurrentMat                                                         M
  698. *****************************************************************************/
  699. void IGSaveCurrentMat(int ViewMode, char *Name)
  700. {
  701.     int    i, j;
  702.     FILE *f;
  703.  
  704.     if (Name == NULL)
  705.     Name = IG_DEFAULT_IRIT_MAT;
  706.  
  707.     if (strlen(Name) == 0 || (f = fopen(Name, "wt")) == NULL) {
  708.     IGIritBeep();
  709.     return;
  710.     }
  711.  
  712.     fprintf(f, "[OBJECT MATRICES\n    [OBJECT VIEW_MAT\n\t[MATRIX");
  713.     for (i = 0; i < 4; i++) {
  714.     fprintf(f, "\n\t    ");
  715.     for (j = 0; j < 4; j++)
  716.         fprintf(f, "%12.9f ", IritPrsrViewMat[i][j]);
  717.     }
  718.     fprintf(f, "\n\t]\n    ]\n");
  719.  
  720.     if (ViewMode == IG_VIEW_PERSPECTIVE) {
  721.     fprintf(f, "    [OBJECT PRSP_MAT\n\t[MATRIX");
  722.     for (i = 0; i < 4; i++) {
  723.         fprintf(f, "\n\t    ");
  724.         for (j = 0; j < 4; j++)
  725.         fprintf(f, "%12.9f ", IritPrsrPrspMat[i][j]);
  726.     }
  727.     fprintf(f, "\n\t]\n    ]\n");
  728.     }
  729.  
  730.     fprintf(f, "]\n");
  731.  
  732.     fclose(f);
  733. }
  734.  
  735. /*****************************************************************************
  736. * DESCRIPTION:                                                               M
  737. * Processesthe given event. Returns TRUE if redraw of view window is needed  M
  738. *                                                                            *
  739. * PARAMETERS:                                                                M
  740. *   Event:          Event to process.                                        M
  741. *   ChangeFactor:   A continuous scale between -1 and 1 to quantify the      M
  742. *                   change to apply according to the event type.         M
  743. *                                                                            *
  744. * RETURN VALUE:                                                              M
  745. *   int:            TRUE if refresh is needed.                               M
  746. *                                                                            *
  747. * KEYWORDS:                                                                  M
  748. *   IGProcessEvent                                                           M
  749. *****************************************************************************/
  750. int IGProcessEvent(IGGraphicEventType Event, RealType ChangeFactor)
  751. {
  752.     int UpdateView = TRUE;
  753.     MatrixType Mat;
  754.  
  755.     MatGenUnitMat(Mat);
  756.  
  757.     switch (Event) {
  758.     case IG_EVENT_SCR_OBJ_TGL:    /* Its Coordinate system - toggle it. */
  759.         UpdateView = FALSE;
  760.         break;
  761.     case IG_EVENT_PERS_ORTHO_TGL:          /* Its View mode - toggle it. */
  762.         break;
  763.     case IG_EVENT_PERS_ORTHO_Z: /* Its Perspective Z focal point modif. */
  764.         if (IGGlblViewMode != IG_VIEW_PERSPECTIVE) {
  765.         IGIritBeep();
  766.         UpdateView = FALSE;
  767.         break;
  768.         }
  769.         /* Make it between 0.5 and 1.5: */
  770.         ChangeFactor = ChangeFactor / 2.0 + 1.0;
  771.         IritPrsrPrspMat[2][2] *= ChangeFactor;
  772.         IritPrsrPrspMat[2][3] *= ChangeFactor;
  773.         IritPrsrPrspMat[3][2] *= ChangeFactor;
  774.         break;
  775.     case IG_EVENT_ROTATE_X:           /* Its rotation along the X axis. */
  776.         MatGenMatRotX1(DEG2RAD(ChangeFactor * MAX_ROTATE_ANGLE), Mat);
  777.         break;
  778.     case IG_EVENT_ROTATE_Y:           /* Its rotation along the Y axis. */
  779.         MatGenMatRotY1(DEG2RAD(ChangeFactor * MAX_ROTATE_ANGLE), Mat);
  780.         break;
  781.     case IG_EVENT_ROTATE_Z:           /* Its rotation along the Z axis. */
  782.         MatGenMatRotZ1(DEG2RAD(ChangeFactor * MAX_ROTATE_ANGLE), Mat);
  783.         break;
  784.     case IG_EVENT_TRANSLATE_X:    /* Its translation along the X axis. */
  785.         MatGenMatTrans(ChangeFactor * MAX_TRANSLATE_FACTOR, 0.0, 0.0, Mat);
  786.         break;
  787.     case IG_EVENT_TRANSLATE_Y:    /* Its translation along the Y axis. */
  788.         MatGenMatTrans(0.0, ChangeFactor * MAX_TRANSLATE_FACTOR, 0.0, Mat);
  789.         break;
  790.     case IG_EVENT_TRANSLATE_Z:    /* Its translation along the Z axis. */
  791.         MatGenMatTrans(0.0, 0.0, ChangeFactor * MAX_TRANSLATE_FACTOR, Mat);
  792.         break;
  793.     case IG_EVENT_SCALE:              /* Its scaling along all axes. */
  794.         if (ChangeFactor > 0.0)              /* Make it around 1... */
  795.             ChangeFactor = ChangeFactor * MAX_SCALE_FACTOR + 1.0;
  796.         else
  797.             ChangeFactor = 1.0 / (-ChangeFactor * MAX_SCALE_FACTOR + 1.0);
  798.         MatGenMatUnifScale(ChangeFactor, Mat);
  799.         break;
  800.     case IG_EVENT_NEAR_CLIP:             /* Near plane clipping. */
  801.         IGGlblZMinClip += ChangeFactor * MAX_CLIP_FACTOR;
  802.         break;
  803.     case IG_EVENT_FAR_CLIP:                      /* Far plane clipping. */
  804.         IGGlblZMaxClip += ChangeFactor * MAX_CLIP_FACTOR;
  805.         break;
  806.         case IG_EVENT_ANIMATION:
  807.         IGGlblAnimation = TRUE;
  808.         AnimGetAnimInfoText(&IGAnimation);
  809.         AnimDoAnimation(&IGAnimation, IGGlblDisplayList);
  810.         IGGlblAnimation = FALSE;
  811.         break;
  812.     case IG_EVENT_DEPTH_CUE:
  813.         break;
  814.     case IG_EVENT_SAVE_MATRIX:
  815.         IGSaveCurrentMat(IGGlblViewMode, NULL);
  816.         UpdateView = FALSE;
  817.         break;
  818.     case IG_EVENT_PUSH_MATRIX:
  819.         GEN_COPY(PushViewMat, IritPrsrViewMat, sizeof(MatrixType));
  820.         GEN_COPY(PushPrspMat, IritPrsrPrspMat, sizeof(MatrixType));
  821.         break;
  822.     case IG_EVENT_POP_MATRIX:
  823.         GEN_COPY(IritPrsrViewMat, PushViewMat, sizeof(MatrixType));
  824.         GEN_COPY(IritPrsrPrspMat, PushPrspMat, sizeof(MatrixType));
  825.         break;
  826.     case IG_EVENT_STATE:
  827.         IGCreateStateMenu();
  828.         break;
  829.     default:
  830.         IGIritBeep();
  831.         UpdateView = FALSE;
  832.     }
  833.  
  834.     if (UpdateView) {
  835.     switch (IGGlblTransformMode) {/* Udpate the global viewing matrix. */
  836.         case IG_TRANS_SCREEN:
  837.             MatMultTwo4by4(IritPrsrViewMat, IritPrsrViewMat, Mat);
  838.         break;
  839.         case IG_TRANS_OBJECT:
  840.         MatMultTwo4by4(IritPrsrViewMat, Mat, IritPrsrViewMat);
  841.         break;
  842.     }
  843.     }
  844.     return UpdateView;
  845. }
  846.  
  847. /*****************************************************************************
  848. * DESCRIPTION:                                                               M
  849. * Free the attribute named Name from all objects in the IGGlblDisplayList.   M
  850. *                                                                            *
  851. * PARAMETERS:                                                                M
  852. *   Name:      Name of attribute to remove.                                  M
  853. *                                                                            *
  854. * RETURN VALUE:                                                              M
  855. *   void                                                                     M
  856. *                                                                            *
  857. * KEYWORDS:                                                                  M
  858. *   IGActiveListFreeNamedAttribute                                           M
  859. *****************************************************************************/
  860. void IGActiveListFreeNamedAttribute(char *Name)
  861. {
  862.     IPObjectStruct
  863.     *PObj = IGGlblDisplayList;
  864.  
  865.     for (; PObj != NULL; PObj = PObj -> Pnext) {
  866.     AttrFreeOneAttribute(&PObj -> Attrs, Name);
  867.     }
  868. }
  869.  
  870. /*****************************************************************************
  871. * DESCRIPTION:                                                               M
  872. * Handle the event of a pop up window. This is the default handler which can M
  873. * be invoked by other specific handlers for event they do not care about.    M
  874. *                                                                            *
  875. * PARAMETERS:                                                                M
  876. *   State:      State event type to handle.                                  M
  877. *   Refresh:    Not used.                             M
  878. *                                                                            *
  879. * RETURN VALUE:                                                              M
  880. *   int:        TRUE if needs to refresh.                                    M
  881. *                                                                            *
  882. * KEYWORDS:                                                                  M
  883. *   IGDefaultStateHandler                                                    M
  884. *****************************************************************************/
  885. int IGDefaultStateHandler(int State, int Refresh)
  886. {
  887.     int UpdateView = TRUE;
  888.  
  889.     switch (State) {
  890.     case IG_STATE_MORE_SENSITIVE:
  891.         IGGlblChangeFactor *= 2.0;
  892.         break;
  893.     case IG_STATE_LESS_SENSITIVE:
  894.         IGGlblChangeFactor *= 0.5;
  895.         break;
  896.     case IG_STATE_SCR_OBJ_TGL:
  897.         IGGlblTransformMode = IGGlblTransformMode == IG_TRANS_OBJECT ?
  898.                              IG_TRANS_SCREEN :
  899.                              IG_TRANS_OBJECT;
  900.         UpdateView = FALSE;
  901.         break;
  902.     case IG_STATE_PERS_ORTHO_TGL:
  903.         IGGlblViewMode = IGGlblViewMode == IG_VIEW_PERSPECTIVE ?
  904.                            IG_VIEW_ORTHOGRAPHIC :
  905.                            IG_VIEW_PERSPECTIVE;
  906.         break;
  907.     case IG_STATE_BACK_FACE_CULL:
  908.         IGGlblBackFaceCull = !IGGlblBackFaceCull;
  909.         break;
  910.     case IG_STATE_DEPTH_CUE:
  911.         IGGlblDepthCue = !IGGlblDepthCue;
  912.         break;
  913.     case IG_STATE_CACHE_GEOM:
  914.         fprintf(stderr, "You cannot change the geometry caching now\n");
  915.         break;
  916.     case IG_STATE_DRAW_INTERNAL:
  917.         IGGlblDrawInternal = !IGGlblDrawInternal;
  918.         break;
  919.     case IG_STATE_DRAW_VNORMAL:
  920.         IGGlblDrawVNormal = !IGGlblDrawVNormal;
  921.         break;
  922.     case IG_STATE_DRAW_PNORMAL:
  923.         IGGlblDrawPNormal = !IGGlblDrawPNormal;
  924.         break;
  925.     case IG_STATE_DRAW_SRF_MESH:
  926.         IGGlblDrawSurfaceMesh = !IGGlblDrawSurfaceMesh;
  927.         break;
  928.     case IG_STATE_DRAW_SRF_POLY:
  929.         IGGlblDrawSurfacePoly = !IGGlblDrawSurfacePoly;
  930.         break;
  931.     case IG_STATE_FOUR_PER_FLAT:
  932.         IGGlblFourPerFlat = !IGGlblFourPerFlat;
  933.         IGActiveListFreeNamedAttribute("_polygons");
  934.         break;
  935.     case IG_STATE_MORE_ISOLINES:
  936.         IGGlblNumOfIsolines *= 2;
  937.         IGActiveListFreeNamedAttribute("_isoline");
  938.         break;
  939.     case IG_STATE_LESS_ISOLINES:
  940.         IGGlblNumOfIsolines /= 2;
  941.         if (IGGlblNumOfIsolines < 2)
  942.         IGGlblNumOfIsolines = 2;
  943.         IGActiveListFreeNamedAttribute("_isoline");
  944.         break;
  945.     case IG_STATE_LONGER_VECTORS:
  946.         IGGlblNormalLen *= 2.0;
  947.         break;
  948.     case IG_STATE_SHORTER_VECTORS:
  949.         IGGlblNormalLen /= 2.0;
  950.         break;
  951.     case IG_STATE_FINER_APPROX:
  952.         IGGlblFineNess *= 2.0;
  953.         IGGlblSamplesPerCurve *= 2;
  954.         IGActiveListFreeNamedAttribute("_polygons");
  955.         IGActiveListFreeNamedAttribute("_isoline");
  956.         break;
  957.     case IG_STATE_COARSER_APPROX:
  958.         IGGlblFineNess /= 2.0;
  959.         if (IGGlblPolygonOptiApprox == 0 && IGGlblFineNess < 2.0)
  960.         IGGlblFineNess = 2.0;
  961.         IGGlblSamplesPerCurve /= 2;
  962.         if (IGGlblSamplesPerCurve < 2)
  963.         IGGlblSamplesPerCurve = 2;
  964.         IGActiveListFreeNamedAttribute("_polygons");
  965.         IGActiveListFreeNamedAttribute("_isoline");
  966.         break;
  967.     case IG_STATE_VIEW_FRONT:
  968.         IGGlblViewMode = IG_VIEW_ORTHOGRAPHIC;
  969.         MatGenUnitMat(IritPrsrViewMat);
  970.         break;
  971.     case IG_STATE_VIEW_SIDE:
  972.         IGGlblViewMode = IG_VIEW_ORTHOGRAPHIC;
  973.         MatGenMatRotY1(DEG2RAD(90.0), IritPrsrViewMat);
  974.         break;
  975.     case IG_STATE_VIEW_TOP:
  976.         IGGlblViewMode = IG_VIEW_ORTHOGRAPHIC;
  977.         MatGenMatRotX1(DEG2RAD(90.0), IritPrsrViewMat);
  978.         break;
  979.     case IG_STATE_VIEW_ISOMETRY:
  980.         IGGlblViewMode = IG_VIEW_ORTHOGRAPHIC;
  981.         GEN_COPY(IritPrsrViewMat, IGGlblIsometryViewMat,
  982.              sizeof(MatrixType));
  983.         break;
  984.     case IG_STATE_CLEAR_VIEW:
  985.         IPFreeObjectList(IGGlblDisplayList);
  986.         IGGlblDisplayList = NULL;
  987.         break;
  988.     case IG_STATE_WIDER_LINES:
  989.         IGGlblLineWidth *= 2;
  990.         break;
  991.     case IG_STATE_NARROW_LINES:
  992.         IGGlblLineWidth /= 2;
  993.         if (IGGlblLineWidth < 1)
  994.         IGGlblLineWidth = 1;
  995.         break;
  996.         case IG_STATE_ANIMATION:
  997.         IGGlblAnimation = TRUE;
  998.         AnimGetAnimInfoText(&IGAnimation);
  999.         AnimDoAnimation(&IGAnimation, IGGlblDisplayList);
  1000.         IGGlblAnimation = FALSE;
  1001.         break;
  1002.     default:
  1003.         UpdateView = FALSE;
  1004.         break;
  1005.     }
  1006.  
  1007.     return UpdateView;
  1008. }
  1009.  
  1010. #ifdef DEBUG
  1011.  
  1012. /*****************************************************************************
  1013. * DESCRIPTION:                                                               *
  1014. *    Dummy function to link at debugging time.                               *
  1015. *                                                                            *
  1016. * PARAMETERS:                                                                *
  1017. *                                                                            *
  1018. * RETURN VALUE:                                                              *
  1019. *   void                                                                     *
  1020. *                                                                            *
  1021. * KEYWORDS:                                                                  *
  1022. *****************************************************************************/
  1023. void DummyLinkCagdDebug(void)
  1024. {
  1025.     IritPrsrDbg();
  1026. }
  1027.  
  1028. #endif /* DEBUG */
  1029.